package E_2024;

import java.util.*;

/*
题目描述
    每个数字关联多个字母，关联关系如下：
    0 关联 “a”,”b”,”c”
    1 关联 “d”,”e”,”f”
    2 关联 “g”,”h”,”i”
    3 关联 “j”,”k”,”l”
    4 关联 “m”,”n”,”o”
    5 关联 “p”,”q”,”r”
    6 关联 “s”,”t”
    7 关联 “u”,”v”
    8 关联 “w”,”x”
    9 关联 “y”,”z”
    输入一串数字后，通过数字和字母的对应关系可以得到多个字母字符串（要求按照数字的顺序组合字母字符串）；
    屏蔽字符串：屏蔽字符串中的所有字母不能同时在输出的字符串出现，如屏蔽字符串是abc，则要求字符串中不能同时出现a,b,c，但是允许同时出现a,b或a,c或b,c等；
    给定一个数字字符串和一个屏蔽字符串，输出所有可能的字符组合；
    例如输入数字字符串78和屏蔽字符串ux，输出结果为uw，vw，vx；数字字符串78，可以得到如下字符串uw，ux，vw，vx；由于ux是屏蔽字符串，因此排除ux，最终的输出是uw，vw，vx;
输入描述
    第一行输入为一串数字字符串，数字字符串中的数字不允许重复，数字字符串的长度大于0，小于等于5；
    第二行输入是屏蔽字符串，屏蔽字符串的长度一定小于数字字符串的长度，屏蔽字符串中字符不会重复；
输出描述
    输出可能的字符串组合
    注：字符串之间使用逗号隔开，最后一个字符串后携带逗号
示例1
    输入
    78
    ux
    输出
    uw,vw,vx,
    说明
    ux完全包含屏蔽字符串ux，因此剔除
示例2
    输入
    78
    x
    输出
    uw,vw
 */
public class E_200_15 {
    public static void main(String[] args) {
        ans("78","ux");
        System.out.println(String.valueOf(new char[]{'a', 'e'}));
    }
    static Map<Character,Character[]> map = new HashMap<>();
    static{
        map.put('0',new Character[]{'a','b','c'});
        map.put('1',new Character[]{'d','e','f'});
        map.put('2',new Character[]{'g','h','i'});
        map.put('3',new Character[]{'j','k','l'});
        map.put('4',new Character[]{'m','n','o'});
        map.put('5',new Character[]{'p','q','r'});
        map.put('6',new Character[]{'s','t'});
        map.put('7',new Character[]{'u','v'});
        map.put('8',new Character[]{'w','x'});
        map.put('9',new Character[]{'y','z'});
    }
    public static void ans(String num, String str){
        List<String> list = new ArrayList<>();
        cc(list,new Stack<>(),num.toCharArray(),0,str.toCharArray(),0);
        System.out.println(list);
    }
    public static void cc(List<String> list, Stack<Character> ch, char[] num, int ni, char[] chs, int index){
        if (index >= chs.length) return;
        if (ni == num.length) {
            list.add(Arrays.toString(ch.toArray()));
            return;
        }
        Character[] characters = map.get(num[ni]);
        for (Character character : characters) {
            ch.add(character);
            if (Objects.equals(character,chs[index]))
                cc(list,ch,num,ni+1, chs, index+1);
            else
                cc(list,ch,num,ni+1, chs, index);
            ch.pop();
        }
    }
}
